package vaccine.appointment.system.common.utils;

import vaccine.appointment.system.common.errorcode.UtilErrorCode;
import vaccine.appointment.system.common.exception.UtilException;

/**
 * 年龄段切割工具类
 * 负责处理将 10-18 这种类型的字符串
 */
public class AgeGroupUtil {
    //构建单例模式
    private AgeGroupUtil(){}

    /**
     * 检查年龄段字符串是否合法
     * @param ageGroup 年龄段字符串
     * @return [最小值, 最大值], 不符合该形式的年龄段会抛出 UtilException
     */
    private static int[] isAgeGroup(String ageGroup) {
        if (ageGroup == null) {
            throw new UtilException(UtilErrorCode.AGE_GROUP_ERROR);
        }

        //移除字符串所有的空格
        String ageGroupRet = ageGroup.replaceAll("\\s", "");

        // 检查是否包含且仅包含一个连字符
        int hyphenIndex = ageGroupRet.indexOf('-');
        if (hyphenIndex == -1 || hyphenIndex != ageGroupRet.lastIndexOf('-')) {
            throw new UtilException(UtilErrorCode.AGE_GROUP_ERROR);
        }

        // 分割字符串
        String[] parts = ageGroupRet.split("-");
        if (parts.length != 2) {
            throw new UtilException(UtilErrorCode.AGE_GROUP_ERROR);
        }

        // 检查两部分是否都是整数
        try {
            int start = Integer.parseInt(parts[0]);
            int end = Integer.parseInt(parts[1]);

            // 检查第一个数字是否小于等于第二个数字
            if(start <= end) {
                return new int[]{start, end};
            } else {
                throw new UtilException(UtilErrorCode.AGE_GROUP_ERROR);
            }
        } catch (NumberFormatException e) {
            throw new UtilException(UtilErrorCode.AGE_GROUP_ERROR);
        }
    }

    /**
     * 获取最小值和最大值的数组
     * @param ageGroup 年龄段字符串
     * @return [最小值, 最大值]
     */
    public static int[] getMinAndMax(String ageGroup) {
        return isAgeGroup(ageGroup);
    }

    /**
     * 获取年龄段最大值
     * @param ageGroup 年龄段字符串
     * @return 最大值
     */
    public static int getMax(String ageGroup) {
        int[] ret = isAgeGroup(ageGroup);
        return ret[1];
    }

    /**
     * 获取年龄段最小值
     * @param ageGroup 年龄段字符串
     * @return 最小值
     */
    public static int getMin(String ageGroup) {
        int[] ret = isAgeGroup(ageGroup);
        return ret[0];
    }

    /**
     * 判断年龄段是否包含某个年龄
     * @param ageGroup 年龄段字符串
     * @param age 年龄
     * @return true 包含  false 不包含
     */
    public static boolean contains(String ageGroup, int age) {
        int[] minAndMax = getMinAndMax(ageGroup);
        return age >= minAndMax[0] && age <= minAndMax[1];
    }
}
